
# include "handle-args.h"

int handle_args(int argc, char** argv, char** file1, char** file2,
                unsigned short int* version, unsigned short int* help, unsigned short int* ignore_case)
{
  unsigned short int done = 0;
  int next_opt = 0, length = 0;
  char* program_name = NULL;
  
  /* opciones cortas válidas */
  const char* const short_opt = "hvi" ;

  /* los valores largos */
  const struct option long_opt[] =
  {
      { "help",         0,  NULL,   'h'},
      { "version",      0,  NULL,   'v'},
      { "ignore-case",  0,  NULL,   'i'},
      { NULL,           0,  NULL,   0  }
  };

  /* retengo referencia al nombre del programa. */
  program_name = argv[0];

  /* Si se ejecuta sin parámetros ni opciones */
  if (argc == 1)
      return HANDLE_ARGS_INSUFFICIENT_OPT;
  
  while (!done)
  {
      /* Llamamos a la función getopt */
      next_opt = getopt_long(argc, argv, short_opt, long_opt, NULL);
	  
      switch (next_opt)
      {
          case 'h' : /* -h o --help */
              *help = 1;
              return HANDLE_ARGS_DONE;
              
          case 'v' : /* -v o --version */
              *version = 1 ;
              return HANDLE_ARGS_DONE;
			  
          case 'i' : /* -i ó --ignore-case */
              *ignore_case = 1; 
              break;
			  
          case '?' : /* opción no valida */
              return HANDLE_ARGS_INVALID_OPT;

          case -1 : /* No hay más opciones */
              done++;
              break;

          default :
              return HANDLE_ARGS_FATAL_ERROR;
	    }
  }

  /* controlamos los argumentos de programa (rutas a archivos). */
  if (2 != argc - optind) return HANDLE_ARGS_WRONG_NUM_ARGS;

  /* paso una referencia a los nombres de los archivos. */
  *file1 = argv[optind];
  *file2 = argv[optind + 1];
    
  return HANDLE_ARGS_DONE;
}

